import { logout, loginPass, loginEmail, loginLegal, menuList } from '@/api/login'
import { getToken, setToken, removeToken,  getAcceptStatus, setAcceptStatus, removeAcceptStatus } from '@/utils/auth'
import router, { resetRouter } from '@/router'
import axios from 'axios'

const state = {
  token: getToken(),
  name: '',   // 用户名
  real_name: '',   // 真名
  addr_code: [],   // 地区编码
  level: '',   // 用户等级
  userId: '',   // 用户id
  menu_list: [],   // 菜单列表
  menu_code_list: [],   // 菜单的床id列表
  accept_status: getAcceptStatus(),   // 当前的审批状态

  avatar: '',
  introduction: '',
  roles: [],
  is_login: false,   // 验证是否登录
}

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_ADDR_CODE: (state, code) => {
    state.addr_code = code
  },
  SET_LEVEL: (state, level) => {
    state.level = level
  },
  SET_USERID: (state, id) => {
    state.userId = id
  },
  SET_REAL_NAME: (state, real) => {
    state.real_name = real
  },
  SET_MENULIST: (state, menu_list) => {   // 设置当前登录者 的右侧菜单
    state.menu_list = menu_list
  },
  SET_MENUCODELIST: (state, menu_code_list) => {   // 设置当前登录者 的右侧菜单id列表
    state.menu_code_list = menu_code_list
  },
  SET_ACCEPT_STATUS: (state, status) => {
    state.accept_status = status
  },


  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  },
  IS_LOGIN: (state, is_login) => {
    state.is_login = is_login
  }
}

const actions = {
  // 用户登录
  login({ commit }, temp) {
    const { type, remember, name, password, cryptograph, verify, email } = temp

    return new Promise((resolve, reject) => {
      if (type == 1) {
        loginPass({ name, password: cryptograph }).then(res => {   // 发起登录的网络请求
          if(res.code == 0) {
            commit('SET_TOKEN', res.data.token)
            commit('SET_ACCEPT_STATUS', res.data.acceptStatus)
            setToken(res.data.token) // 将token存入 cookie中
            setAcceptStatus( res.data.acceptStatus)

            if (remember) { // 将账号密码存入本地
              window.localStorage.setItem('checked', true)
              window.localStorage.setItem('pwd',password)
            }
            else {
              window.localStorage.removeItem('checked')
            }
            window.localStorage.setItem('user_accout', name)

            if(res.data.acceptStatus == 1) {
              resolve(1)   // 待审核
            }
            else if(res.data.acceptStatus == 2) {
              resolve(2)   // 审核通过 正常登录
            }
            else if(res.data.acceptStatus == 3) {
              resolve(3)   // 未通过
            }
            else {
              // reject('登录失败')
            }
            
          }
          else if(res.code == -4) {
            reject(res)
          }

        }).catch(error => {
          reject('网络错误')
        })
      }
      else if (type == 2) {   // 验证码登录
        loginEmail({ email, emailCaptcha: verify }).then(res => {   // 发起登录的网络请求
          if(res.code == 0) {
            commit('SET_TOKEN', res.data.token)
            commit('SET_ACCEPT_STATUS', res.data.acceptStatus)
            setToken(res.data.token) // 将token存入 cookie中
            setAcceptStatus( res.data.acceptStatus)

            if (remember) { // 将账号密码存入本地
              window.localStorage.setItem('checked', true)
              // window.localStorage.setItem('pwd',password)
            }
            else {
              window.localStorage.removeItem('checked')
            }
            window.localStorage.setItem('user_accout', email)
            if(res.data.acceptStatus == 1) {
              resolve(1)   // 待审核
            }
            else if(res.data.acceptStatus == 2) {
              resolve(2)   // 审核通过 正常登录
            }
            else if(res.data.acceptStatus == 3) {
              resolve(3)   // 未通过
            }
            else {
              reject('登录失败')
            }
            
          }
          else if(res.code == -4) {
            reject(res)
          }

        }).catch(error => {
          reject(error)
        })
      }
    })
  },

  
  // 获取用户信息
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      commit('SET_ROLES', ['wwww'])

      axios.all([
        // 获取用户信息
        loginLegal().then(res => {
          if(res.code == 0) {
            commit('SET_NAME', res.data.user.name)   // 用户名
            commit('SET_REAL_NAME', res.data.user.realName)   // 真名
            commit('SET_USERID', res.data.user.id)   // 用户ID
            commit('SET_LEVEL', res.data.level)   // 当前登录者, 等级
            commit('SET_ADDR_CODE', res.data.addressList)   // 当前登录者, 网点的地区编码
          }
          else {   // 获取失败怎么弄###
            reject('用户信息请求失败')
          }
        }),
         // 获取该用户 菜单列表
        menuList({appCode: 80000}).then(res => {
          commit('SET_MENULIST', res.data.menuList)
          commit('SET_MENUCODELIST', res.data.menuCodeList)
          window.localStorage.setItem('munulist', JSON.stringify(res.data.menuList)) // 把menulist的对象存入本地
          // let list_perms = getMenuId(res.data, true, true, 1)
          // // 获取 目录/菜单 id 列表
          // function getMenuId(menu_data, recursion=true, flt_type=true, num=1, exclude=false) {
          //   let perms = []   // 存所具有的 权限的 menuId
          //   function getMenuPerms(menu) {   // 获取的当前菜单所拥有的权限列表, 数组格式
          //     menu.forEach( (item,i) => {
          //       if(flt_type && item.type != num) {   //num=1或2   过滤掉type==1的 或者过滤掉type==2的
          //         if(exclude && item.parentId!=0) {   // exclude是排除,  排除掉parentId==0的
          //           perms.push(item.menuId)
          //         }
          //         else if(!exclude) {perms.push(item.menuId)}
          //       }
          //       else if(!flt_type) {   // 不做过滤的所有的都 添加到perms中
          //         perms.push(item.menuId)
          //       }
          //       if(recursion && item.childrenList.length > 0) {   // recursion是否递归遍历 子菜单项
          //         getMenuPerms(item.childrenList)
          //       }
          //     })
          //   }
          //   getMenuPerms(menu_data)
          //   return perms
          // }
          window.localStorage.setItem('permsId_list', JSON.stringify(res.data.menuCodeList || [])) // 把permsidlist的对象存入本地
          
        })
      ]).then(() => {
        resolve({roles: ['wwww']})
      }).catch(err => {
        reject(err)
      })

     
      
      
    })
  },

  // 用户退出
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      logout().then(() => {
        commit('SET_NAME', '')   // 用户名
        commit('SET_REAL_NAME', '')   // 真名
        commit('SET_USERID', '')   // 用户ID
        commit('SET_LEVEL', '')   // 当前登录者, 等级
        commit('SET_ADDR_CODE', [])   // 当前登录者, 网点的地区编码
        
        commit('SET_TOKEN', '')
        commit('SET_ACCEPT_STATUS', '')
        commit('SET_ROLES', [])
        removeToken()
        removeAcceptStatus()
        resetRouter()

        // 重置已访问view和缓存view
        dispatch('tagsView/delAllViews', null, { root: true })

        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // 删除token
  resetToken({ commit }) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '')
      commit('SET_ACCEPT_STATUS', '')
      commit('SET_ROLES', [])
      removeToken()
      removeAcceptStatus()
      resolve()
    })
  },

  // 动态修改权限
  async changeRoles({ commit, dispatch }, role) {
    const token = role + '-token'

    commit('SET_TOKEN', token)
    setToken(token)

    const { roles } = await dispatch('getInfo')

    resetRouter()

    // 生成基于角色可访问的 路由映射
    const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
    // 动态添加可访问的路由
    router.addRoutes(accessRoutes)

    // 重置已访问view和缓存view
    dispatch('tagsView/delAllViews', null, { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
